package com.deng.eventflow.core;

import com.deng.eventflow.core.petitpoucet.NodeFunction;
import com.deng.eventflow.core.petitpoucet.ProvenanceNode;


public interface EventTracker {

    /**
     * 将来自处理器的输出事件关联到任意节点函数。
     * @param id 处理器的 ID
     * @param f 节点功能
     * @param out_stream_index 产生此输出事件的处理器中流的索引
     * @param out_stream_pos 此输出事件对应的流中的位置
     */
    void associateTo(int id, NodeFunction f, int out_stream_index, int out_stream_pos);

    /**
     * 将来自处理器的输出事件与来自同一处理器的输入事件相关联。
     * @param id 处理器的 ID
     * @param in_stream_index 要关联的输入事件对应的处理器中流的索引
     * @param in_stream_pos 该事件对应的输入流中的位置
     * @param out_stream_index 产生输出事件的处理器中流的索引
     * @param out_stream_pos 此输出事件对应的流中的位置
     */
    void associateToInput(int id, int in_stream_index, int in_stream_pos, int out_stream_index,
                          int out_stream_pos);

    /**
     * 将来自处理器的输出事件与来自同一处理器的另一个输出事件相关联。
     * @param id 处理器的 ID
     * @param in_stream_index 要关联的输入事件对应的处理器中流的索引
     * @param in_stream_pos 该事件对应的输入流中的位置
     * @param out_stream_index 产生输出事件的处理器中流的索引
     * @param out_stream_pos 此输出事件对应的流中的位置
     */
    void associateToOutput(int id, int in_stream_index, int in_stream_pos,
                           int out_stream_index, int out_stream_pos);


    /**
     * 获取给定事件的出处树。
     * @param proc_id
     * @param stream_index
     * @param stream_pos
     * @return
     */
    ProvenanceNode getProvenanceTree(int proc_id, int stream_index,
                                     int stream_pos);

    /**
     *
     * @param output_proc_id
     * @param output_stream_index
     * @param input_proc_id
     * @param input_stream_index
     */
    void setConnection(int output_proc_id, int output_stream_index, int input_proc_id,
                       int input_stream_index);

    /**
     * 将此跟踪器同时关联到多个处理器
     * @param processors
     */
    void setTo(Processor ... processors);

    /**
     * 获取事件跟踪器的副本+
     * @return
     */
    EventTracker getCopy();
}
